//滑动窗口
//给定一个数组和滑动窗口的大小，找出所有滑动窗口里数值的最大值。
例如，如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3，那么一共
存在6个滑动窗口，他们的最大值分别为{4,4,6,6,6,5}； 针对数组
{2,3,4,2,6,2,5,1}的滑动窗口有以下6个： {[2,3,4],2,6,2,5,1}，
{2,[3,4,2],6,2,5,1}，{2,3,[4,2,6],2,5,1}，{2,3,4,[2,6,2],5,1}
{2,3,4,2,[6,2,5],1}，{2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候，返回空

//思路，利用优先级队列进行遍历
import java.util.*;
class Solution{
	PriorityQueue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>(){
		@Override
		public int compare(Integer o1,Integer o2){
			return o2.compareTo(o1);
		}
	});//重写compare方法是为了让优先级队列底部的堆转化为大根堆
	public ArrayList<Integer> maxWindows(int[] num,int size){
		ArrayList<Integer> list=new ArrayList<>();//存放结果
		if(num.length==0||size<1||size>num.length){
			return list;
		}
		int i=0;
		for(;i<size;i++){//初始化滑动窗口
			queue.add(num[i]);
		}
		while(i<num.length){//向后滑动并取出每个窗口的最大值，放入list
			list.add(queue.peek());
			queue.add(num[i]);
			queue.remove(num[i-size]);
			i++;
		}
			list.add(queue.peek());//最后一次入堆的结果没保留，再做一次(30~31)
	return list;
	}
}